<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: Cross compilation for ARM based Linux systems</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="../../d9/df8/tutorial_root.html">OpenCV Tutorials</a></li><li class="navelem"><a class="el" href="../../df/d65/tutorial_table_of_content_introduction.html">Introduction to OpenCV</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Cross compilation for ARM based Linux systems </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><b>Prev Tutorial:</b> <a class="el" href="../../d0/db2/tutorial_macos_install.html">Installation in MacOS</a></p>
<p><b>Next Tutorial:</b> <a class="el" href="../../d6/d15/tutorial_building_tegra_cuda.html">Building OpenCV for Tegra with CUDA</a></p>
<table class="doxtable">
<tr>
<th align="right"></th><th align="left"></th></tr>
<tr>
<td align="right">Original author </td><td align="left">Alexander Smorkalov </td></tr>
<tr>
<td align="right">Compatibility </td><td align="left">OpenCV &gt;= 3.0 </td></tr>
</table>
<dl class="section warning"><dt>Warning</dt><dd>This tutorial can contain obsolete information.</dd></dl>
<p>This steps are tested on Ubuntu Linux 12.04, but should work for other Linux distributions. I case of other distributions package names and names of cross compilation tools may differ. There are several popular EABI versions that are used on ARM platform. This tutorial is written for <em>gnueabi</em> and <em>gnueabihf</em>, but other variants should work with minimal changes.</p>
<h2>Prerequisites </h2>
<ul>
<li>Host computer with Linux;</li>
<li>Git;</li>
<li>CMake 2.6 or higher;</li>
<li>Cross compilation tools for ARM: gcc, libstc++, etc. Depending on target platform you need to choose <em>gnueabi</em> or <em>gnueabihf</em> tools. Install command for <em>gnueabi</em>: <div class="fragment"><div class="line">sudo apt-get install gcc-arm-linux-gnueabi</div></div><!-- fragment --> Install command for <em>gnueabihf</em>: <div class="fragment"><div class="line">sudo apt-get install gcc-arm-linux-gnueabihf</div></div><!-- fragment --></li>
<li>pkgconfig;</li>
<li>Python 2.6 for host system;</li>
<li>[optional] ffmpeg or libav development packages for armeabi(hf): libavcodec-dev, libavformat-dev, libswscale-dev;</li>
<li>[optional] GTK+2.x or higher, including headers (libgtk2.0-dev) for armeabi(hf);</li>
<li>[optional] libdc1394 2.x;</li>
<li>[optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev for armeabi(hf).</li>
</ul>
<h2>Getting OpenCV Source Code </h2>
<p>You can use the latest stable OpenCV version available in <em>sourceforge</em> or you can grab the latest snapshot from our <a href="https://github.com/opencv/opencv.git">Git repository</a>.</p>
<h3>Getting the Latest Stable OpenCV Version</h3>
<ul>
<li>Go to our <a href="http://sourceforge.net/projects/opencvlibrary">page on Sourceforge</a>;</li>
<li>Download the source tarball and unpack it.</li>
</ul>
<h3>Getting the Cutting-edge OpenCV from the Git Repository</h3>
<p>Launch Git client and clone <a href="http://github.com/opencv/opencv">OpenCV repository</a></p>
<p>In Linux it can be achieved with the following command in Terminal: </p><div class="fragment"><div class="line">cd ~/&lt;my_working _directory&gt;</div><div class="line">git clone https://github.com/opencv/opencv.git</div></div><!-- fragment --><h2>Building OpenCV </h2>
<ol type="1">
<li>Create a build directory, make it current and run the following command: <div class="fragment"><div class="line">cmake [&lt;some optional parameters&gt;] -DCMAKE_TOOLCHAIN_FILE=&lt;path to the OpenCV source directory&gt;/platforms/linux/arm-gnueabi.toolchain.cmake &lt;path to the OpenCV source directory&gt;</div></div><!-- fragment --> Toolchain uses <em>gnueabihf</em> EABI convention by default. Add -DSOFTFP=ON cmake argument to switch on softfp compiler. <div class="fragment"><div class="line">cmake [&lt;some optional parameters&gt;] -DSOFTFP=ON -DCMAKE_TOOLCHAIN_FILE=&lt;path to the OpenCV source directory&gt;/platforms/linux/arm-gnueabi.toolchain.cmake &lt;path to the OpenCV source directory&gt;</div></div><!-- fragment --> For example: <div class="fragment"><div class="line">cd ~/opencv/platforms/linux</div><div class="line">mkdir -p build_hardfp</div><div class="line">cd build_hardfp</div><div class="line"></div><div class="line">cmake -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../..</div></div><!-- fragment --></li>
<li>Run make in build (&lt;cmake_binary_dir&gt;) directory: <div class="fragment"><div class="line">make</div></div><!-- fragment --></li>
</ol>
<dl class="section note"><dt>Note</dt><dd>Optionally you can strip symbols info from the created library via install/strip make target. This option produces smaller binary ( twice smaller) but makes further debugging harder.</dd></dl>
<h3>Enable hardware optimizations</h3>
<p>Depending on target platform architecture different instruction sets can be used. By default compiler generates code for armv5l without VFPv3 and NEON extensions. Add -DENABLE_VFPV3=ON to cmake command line to enable code generation for VFPv3 and -DENABLE_NEON=ON for using NEON SIMD extensions.</p>
<p>TBB is supported on multi core ARM SoCs also. Add -DWITH_TBB=ON and -DBUILD_TBB=ON to enable it. Cmake scripts download TBB sources from official project site <a href="http://threadingbuildingblocks.org/">http://threadingbuildingblocks.org/</a> and build it. </p>
</div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:36 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
